Programmable integrated circuits are a type of integrated circuit that can be configured by a user to implement custom logic functions. In a typical scenario, a logic designer uses computer-aided design (CAD) tools to design a custom logic circuit. When the design process is complete, the CAD tools generate configuration data. The configuration data is loaded into a programmable integrated circuit to configure the device to perform desired logic functions.
In a typical system, a programmable integrated circuit, memory devices, and other electronic components are mounted on a printed circuit board. The programmable integrated circuit includes memory interface circuitry that is used to relay data back and forth between the programmable integrated circuit and the memory devices (i.e., the memory interface circuitry is used to read data from and write data into the memory devices). When performing such memory read and write operations, the timing and accuracy of control and data signals that are conveyed between the programmable integrated circuit and the memory devices are critical.
In order to support operations with a wide range of data widths, programmable integrated circuits have been provided with dedicated memory interface circuitry (sometimes referred to as “hard” memory interface circuits). The hard memory interface is organized into groups that are referred to as “tiles,” each of which can be used to drive 48 input-output pins and is equipped with a set of memory controller logic and data buffers. Multiple tiles can be concatenated together to form interfaces having a wide range of data widths. For example, six tiles can be concatenated together to support a 144-bit memory interface. Even though multiple tiles can be configured to support different data widths, each individual tile is non-reconfigurable.
This implementation in which each memory interface tile is formed using only non-reconfigurable circuits requires that error detection and correction circuits be placed in every single tile. Since the error detection and correction circuits require that all data bits be present at the same time to perform encoding and decoding operations and that all data bits from associated neighboring tiles need to be routed to the local tile that is performing the encoding/decoding. This routing requirement results in a significant number of wires and consumes valuable routing space.